#ifndef SERIAL_H
#define SERIAL_H

#include <QMainWindow>
/*----------用户添加------------*/
#include <QSerialPort>
#include <QThread>
#include <QDebug>
#include <QTimer>
#include <QSettings>    //配置文件.ini文件读写函数
#include <QSerialPortInfo>//获取系统串口信息
#include <QLabel>
#include <QTime>
/*----------------------------*/

#include "chartfigure.h"     //曲线图表
#include "charttable.h"      //表格
#include "dialogcompany.h"   //公司简介弹窗
#include "dialogabout.h"     //关于弹窗


namespace Ui {
class Serial;
}



////单独485数据帧命令
struct SEND_CMD{
    QString temper_cmd;
    QString flow_cmd;
    QString cmd;
};


////485单个数据帧赋值结构体
struct MODBUS_SEND_CMD_CHECK{
    QString old_addr;       //旧地址
    QString func_read_data; //485读命令
    QString start_addr[2];  //读数据寄存器地址
    QString data_len[2];    //返回数据帧中数据的个数
    QString crc;

    QString new_addr_reg[2];   //从机地址寄存器的地址
    QString new_addr_data[2];  //待修改的从机地址
    QString new_addr;          //修改后的从机地址
    QString func_write_addr;   //485写命令
};


////数据点
struct SHOW_PARAM{
    float temper_f;
    float flow_f;
};

////保存数据路径
struct SAVE_FILE_PATH{
    QString temperpath;
    QString flowpath;
};


////报警类型
struct ALARM_TYPE{
    bool alarm_temper;
    bool alarm_temper_upper;
    bool alarm_temper_lower;
    bool alarm_flow;
    bool alarm_flow_upper;
    bool alarm_flow_lower;
};

////数据安全限值
struct SAFE_SCOPE{
    float temper_upper;
    float temper_lower;
    float flow_upper;
    float flow_lower;
};

////复位报警源
struct RESET_FLAG{
  bool reset_temper;
  bool reset_flow;
};

////报警灯颜色
enum{
  red = 1,
  green = 2,
};

/*--------配置串口---------*/
typedef struct{
    QString port_name;      //串口号
    qint32  baud_rate;      //串口波特率
    qint8   data_bit;       //数据位
    QString check_bit;      //校验位
    qint8   stop_bit;       //停止位
    //qint8   scan_time;    //扫描时间
}ConfigData;



class Serial : public QMainWindow
{
    Q_OBJECT

public:
    explicit Serial(QWidget *parent = 0);
    ~Serial();
    /*-----------用户函数-------------*/
    static Serial *serialClass;    //静态指针变量

    void system_init();         //系统初始化
    void ArraySplit(QByteArray);//字符分割，保存数据

    void loadConfigData();      //从配置文件中加载保存的配置参数
    void getSerialPort();       //获取本机所有的串口号
    void ConfigBuadRate();      //波特率配置
    void ConfigCheckBit();      //校验位配置
    void ConfigDataBit();       //数据位配置
    void ConfigStopRate();      //停止位配置

    void show_tips(QString tip);   //显示提示操作等等（左下角）
    void print_log(QString, int);  //打印日志（日志框）
    void msgboxcreate(QMessageBox *msgbox, QString, QString, int);   //消息框创建

    QLabel *lb_tips;            //左下角提示
    QSerialPort global_port;    //串口类变量
    bool port_flag = false;     //串口打开/关闭标志
    SHOW_PARAM obj_param;       //数据结构体

    SAFE_SCOPE obj_safe_scope;  //数据安全限值
    bool unit_flow_ml = true;   //流量默认单位ml/min
    bool unit_temper_ssd = true;//温度默认单位℃
    /*------------------------------*/

/*--------------槽函数----------------*/
public slots:
    void auto_send_recv_data();     //自动发送/接收命令
    void btn_OpenSerial_clicked();  //打开串口按钮
    void btn_CloseSerial_clicked(); //关闭串口按钮
    void btn_ScanSerial_clicked();  //串口扫描按钮
    void lb_getDateTime();          //显示实时时间

    void save_temperDataTo_file();  //保存温度数据
    void save_flowDataTo_file();    //保存流量数据
    void query_temperData_history();//查询温度历史记录
    void query_flowData_history();  //查询流量历史记录

    void set_temper_upper();    //温度上限
    void set_temper_lower();    //温度下限
    void set_flow_upper();      //流量上限
    void set_flow_lower();      //流量下限

    void reset_system();        //系统复位

    void btn_reset_temper_alarm();      //复位温度报警
    void btn_reset_flow_alarm();        //复位流量报警
    void btn_reset_allParam_alarm();    //复位所有报警

    void btn_clear_log();   //清除日志
    void btn_save_log();    //保存日志

    void btn_set_slave_addr();        //修改从机地址
    void btn_set_serial_param();      //修改modbus串口连接参数
    void btn_back_serial_param();     //还原modbus串口连接参数
    void btn_back_safe_limit_param(); //还原参数安全上下限

    /*--------------菜单栏（Begin）----------------*/
    void menu_exit_click();     //退出
    void menu_open_temp_fold(); //打开临时文件目录
    void menu_open_log_fold();  //打开日志文件目录
    void menu_open_log_file();  //打开日志文件
    void menu_company_web();    //公司官网
    void menu_company_about();  //公司简介
    void menu_about_click();    //关于
    void menu_unit_flow_L();    //流量单位L/H
    void menu_unit_flow_ML();   //流量单位ML/MIN
    void menu_unit_temper_SSD();//温度单位℃
    void menu_unit_temper_HSD();//温度单位℉

    /*--------------菜单栏（End）----------------*/
/*-----------------------------------*/

protected:


private:
    Ui::Serial *ui;
    SEND_CMD obj_cmd = {"01 03 00 01 00 01 D5 CA" , //温度
                        "01 03 00 00 00 01 84 0A",  //流量
                        "010300000002C40B"};        //发送的命令

    QTimer send_cmd_timer;      //自动发送数据帧的定时器
    QTimer datetime_clock;      //实时时钟定时器
    QString   iniFilePath;      //读取ini配置文件路径
    QSettings   *settings;      //QSettings类读写ini文件
    QDir *path;                 //文件夹路径 QDir类
    QString curPath;            //文件夹路径名 QString类
    QDateTime currentTime;      //时间

    bool serial_conn_flag = false;  //串口连接
    bool alarm_toggle = false;      //报警1标志切换
    bool alarm_toggle2 = false;     //报警2标志切换

    SAVE_FILE_PATH  obj_datafile_path;  //数据保存路径
    ALARM_TYPE obj_alarmType;   //报警类型
    RESET_FLAG obj_resetFlag;   //复位标志
    MODBUS_SEND_CMD_CHECK obj_send_crcCal_tf;   //用于CRC校的验数据帧


    void showUIConfigData();       //将参数显示到页面上
    void set_warning_LED(int size, int color);  //设置报警灯样式
    void auto_alarm_check();      //自动报警检查函数
    void auto_alarm_Temp_LED();   //温度报警灯闪烁函数
    void auto_alarm_Flow_LED();   //温度报警灯闪烁函数
    void cmd_init_ready();        //发送命令初始化
    void file_fold_init();        //文件(夹)初始化

    /*--------------菜单栏弹窗（Begin）----------------*/
    DialogCompany *dialog_company;  //公司简介弹窗
    DialogAbout *dialog_about;      //关于弹窗
    /*---------------菜单栏弹窗（End）----------------*/

    ChartFigure *figure;    //曲线图表
    ChartTable *table;      //表格
};



#endif // SERIAL_H
